package com.itheima.d3_log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 目标：掌握LogBack日志框架的使用。
 * 日志：
 * 好比生活中的日记，可以记录你生活中的点点滴滴。
 * 程序中的日志，通常就是一个文件，里面记录的是程序运行过程中的各种信息。
 *
 * 目前记录日志的方案：
 * public static  void test(String number){
 * try {
 * int result = Integer.parseInt(number);
 * System.out.println("输入的数字为" + result);
 * } catch (NumberFormatException e) {
 * System.out.println("输入的数字有误，请输入一个整数");
 * }}
 * 输出语句的弊端：
 * 日志会展示在控制台
 * 不能更方便的将日志记录到其他的位置（文件，数据库）
 * 想取消日志，需要修改源代码才可以完成
 * 性能较差
 *
 * 对比输出语句，日志技术的优点：
 * 可以将日志信息写入到文件或者数据库中
 * 不需要修改代码，灵活性比较好
 * 性能较好
 *
 * 日志技术:
 * 可以将系统执行的信息，方便的记录到指定的位置（控制台、文件中、数据库中）。
 * 可以随时以开关的形式控制日志的启停，无需侵入到源代码中去进行修改。
 * 什么是日志？
 * 用来记录程序运行过程中的信息，并可以进行永久存储。
 *
 *日志技术的体系结构:
 * 1.日志框架：  JUL（java.util.loggiing）   Log4j   Logback     其他实现
 *
 * 2.日志接口：  Commons Logging (JCL)       Simple Logging Facade for Java (SLF4J)
 *
 * 日志框架：牛人或者第三方公司已经做好的实现代码，后来者直接可以拿去使用。
 * 日志接口：设计日志框架的一套标准，日志框架需要实现这些接口。(每一套日志框架都不同，为了降低程序员了解每个框架的压力，就推出了日志接口)
 * 注意1：因为对Commons Logging接口不满意，有人就搞了SLF4J；因为对Log4j的性能不满意，有人就搞了Logback。
 * 注意2：Logback是基于slf4j的日志规范实现的框架。（用的最多）所以我们用Logback框架和SLF4J接口
 *
 * Logback日志框架官方网站:https://logback.qos.ch/index.html
 * Logback日志框架有以下几个模块：
 * 1、 logback-core：      基础模块，是其他两个模块依赖的基础（必须有）
 * 2、 logback-classic:   完整实现了slf4j API的模块（必须有）
 * 3、 logback-access:    与 Tomcat 和 Jetty 等 Servlet 容器集成，以提供 HTTP 访问日志的功能（可选，以后再接触）
 *
 * 想使用Logback日志框架，至少需要在项目中整合如下三个模块：（一个一个下载太麻烦，磊哥说以后是用Maven自动下载）
 * slf4j-api，日志接口   logback-core    logback-classic
 *
 * Logback快速入门
 * 需求
 * 使用Logback日志框架，纪录系统的运行信息。
 * 实现步骤
 * ①：导入Logback框架(以下三个模块)到项目中去。
 *  slf4j-api：日志接口   logback-core    logback-classic
 *
 * ②：将Logback框架的核心配置文件logback.xml直接拷贝到src目录下（必须是src下）。
 *
 * ③：创建Logback框架提供的Logger对象，然后用Logger对象调用其提供的方法就可以记录系统的日志信息。
 *  public static final Logger LOGGER = LoggerFactory.getLogger(“类名");
 *
 *
 * 使用Logback日志框架记录日志的具体步骤是?
 * ①：在项目下新建文件夹lib，导入Logback的相关jar包到该文件夹下，并添加到项目库中去。
 * ②：必须将Logback的核心配置文件logback.xml直接拷贝到src目录下。
 * ③：在代码中获取日志的对象
 * ④：调用日志对象的方法记录日志信息
 *
 * 核心配置文件logback.xml
 *      对Logback日志框架进行控制的。
 * 日志的输出位置、输出格式的设置
 *      通常可以设置2个输出日志的位置：一个是控制台、一个是系统文件中
 *      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
 *      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 *      开启日志（ALL），取消日志(OFF)
 *      <root level=“ALL">
 *          <appender-ref ref="CONSOLE"/>
 *          <appender-ref ref="FILE" >
 *      </root>
 *
 * Logback设置日志级别:
 * 日志级别指的是日志信息的类型，日志都会分级别，常见的日志级别如下（优先级依次升高）：
 * trace    追踪，指明程序运行轨迹
 * debug    调试，实际应用中一般将其作为最低级别，而 trace 则很少使用
 * info     输出重要的运行信息，数据连接、网络连接、IO操作等等，使用较多
 * warn     警告信息，可能会发生问题，使用较多
 * error    错误信息,  使用较多
 *
 * 为什么要学习日志级别：
 * <root level=“info">
 *     <appender-ref ref="CONSOLE"/>
 *     <appender-ref ref="FILE" >
 * </root>
 * 只有日志的级别是大于或等于核心配置文件配置的日志级别，才会被记录，否则不记录。
 *
 * 1、什么是日志级别，日志级别有哪些？
 *      用于控制系统中哪些日志级别是可以输出的。
 * 2、日志级别的作用是啥？
 *      ALL和OFF分别是打开全部日志和关闭全部日志
 *      级别程度依次是：TRACE< DEBUG< INFO<WARN<ERROR
 *      默认级别是debug（忽略大小写），只输出当前级别及高于该级别的日志
 */
public class LogBackTest {
   /*
         ③：创建Logback框架提供的Logger对象，然后用Logger对象调用其提供的方法就可以记录系统的日志信息。
           public static final Logger LOGGER = LoggerFactory.getLogger(“类名");

       创建一个Logger日志对象（一般一个项目中只需要一个日志对象，并且不让别人更改或者替换，所以用static和finally修饰）
       并且Logger日志对象要import org.slf4j.Logger;不要写错了，然后调用LoggerFactory工厂得到一个对象，参数是声明你这个日志对象的名字
*/
    public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");

    public static void main(String[] args) {
        //while (true) {
            try {
                LOGGER.info("chu法方法开始执行~~~");
                chu(10, 0);
                LOGGER.info("chu法方法执行成功~~~");
            } catch (Exception e) {
                LOGGER.error("chu法方法执行失败了，出现了bug~~~");
            }
        //}
    }

    public static void chu(int a, int b){
        LOGGER.debug("参数a:" + a);
        LOGGER.debug("参数b:" + b);
        int c = a / b;
        LOGGER.info("结果是：" + c);
    }
}
